import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui'
import { getTimeStamp } from '@/utils/auth'

const TimeOut = 5400 // 定义超时时间

const service = axios.create({
    // 设置基地址
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: 5000 // 超过5s不响应就超时
})

// 请求拦截器
service.interceptors.request.use(
    async config => {
        // config是请求配置
        // 取token

        if (store.getters.token) {
            // 检查token的时效性
            if (CheckIsTimeOut()) {
                await store.dispatch('user/logout')

                router.push('/login')
                return Promise.reject(new Error('登录信息已失效，请重新登陆'))
            }
            config.headers.Authorization = `Bearer ${store.getters.token}`
        }

        // 一定要return config
        return config

    }, error => {
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(response => {
    // 成功执行
    // axios默认加一层data
    const { success, message, data } = response.data
    if (success) {
        // 业务执行成功
        return data
    } else {
        // 业务失败
        Message.error(message)
        return Promise.reject(new Error(message))
    }
}, async error => {

    if (error.response && error.response.data && error.response.data.code === 10002) {
        await store.dispatch('user/logout')

        router.push('/login')
    }
    //失败
    Message.error(error.message)

    // reject
    return Promise.reject(error)
})


/**
 * 检查token是否过期
 */
function CheckIsTimeOut() {
    // 当前时间减去存储时间戳大于时效性 false
    return (Date.now() - getTimeStamp()) / 1000 > TimeOut
}

export default service